package realQuestion.redBook;

import java.util.Scanner;
//小明数列
//        时间限制： 3000MS
//        内存限制： 589824KB
//        题目描述：
//        小明了解了递归函数，十分喜欢递归这一概念。他用递归的概念定义了一个数列{an}，其中a0和a1均为1，对于i≥2，
//
//        ai=ai-1*A+ai-2*B。递归定义让小明十分开心，但是算起来却很痛苦，现在小明想让你帮他算一算。考虑到数列可能很大，小明觉得你告诉他对应项模上M之后的答案就可以了（数列中的每一个数叫做这个数列的项）。
//
//
//
//        输入描述
//        第一行三个数A，B，M，含义见题面。
//
//        接下来一行一个数Q，表示小明询问次数。
//
//        接下来一行Q个数q1,q2,...,qQ，第i个数qi表示小明第i次询问数列第qi项模上数字M后的答案。
//
//        对于所有数据，1≤Q,qi≤50000，1≤A,B,M≤108
public class Test1 {

    public  void  inputParameters()
    {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
//  CKG TODO 2023/5/8: 正则表达式\\s+表示匹配任何空白字符一次或多次 数组strings里面也不含有空格
        String[] strings = s.split("\\s+");
//        for (String a: strings) {
//            System.out.println(Integer.parseInt(a));
//        }
        int [] paramters=new int[strings.length];
        for (int i = 0; i < strings.length; i++) {
            paramters[i]=Integer.parseInt(strings[i]);
        }
        int A=paramters[0];
        int B=paramters[1];
        int M=paramters[2];
        arrayTest(A,B,M);
    }

    public  void  arrayTest(int  A,int B,int M){

if (A<1||A>100000000||B<1||B>100000000||M<1||M>100000000){
    System.out.println("输入的参数不合法,  请重新输入:");
    inputParameters();
}
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入询问次数：");
//      while (scanner.hasNext()){
          int times = scanner.nextInt();
          if (times>50000||times<1){
              System.out.println("输入的询问次数不合法！！请重新输入");
          }
          int[] arr=new int[times+2];

          for (int i = 0; i < times+2; i++) {
              arr[i]=countArrayIndex(A,B,i)%M;
          }
          for (int i = 2; i <times+2 ; i++) {
              System.out.print(arr[i]+" ");

          }

//      }


    }

    public  int  countArrayIndex(int A,int B,int times){
        if (times==0){
            return 0;
        }
        if (times==1||times==2){
           return 1;
        }
        return A*countArrayIndex(A,B,times-1)+B*countArrayIndex(A,B,times-2);
    }


    public static void main(String[] args) {
        Test1 test1 = new Test1();
test1.inputParameters();
    }

}
